package edu.istu.asu07_1.live.model;

import java.util.ArrayList;
import java.util.List;

import edu.istu.asu07_1.live.configs.Constants;
import edu.istu.asu07_1.live.model.agents.Agent;
import edu.istu.asu07_1.live.model.agents.Herb;
import edu.istu.asu07_1.live.model.agents.Herbivore;
import edu.istu.asu07_1.live.model.agents.Predator;
import edu.istu.asu07_1.live.model.agents.controller.NeuralController;

/**
 * Класс, реализующий модель системы
 * @author romanches
 *
 */
public class Model implements Taktable{

	//список агентов
	private List<Agent> agentsList;

	public Model(){
		agentsList = new ArrayList<Agent>();

		AgentLocationCreator locationCreator = new AgentLocationCreator(agentsList);

		for(int i = 0; i<Constants.INITIAL_HERB_COUNT; i++){
			new Herb(1, 1, 0, Constants.DEFAULT_AGENT_ENERGY, 0, new NeuralController(Constants.HERB_WEIGHT_MATRIX, Constants.HERB_SHIFT_VECTOR), this);
		}
		for(int i=0; i<Constants.INITIAL_HERBIVORE_COUNT; i++){
			new Herbivore(1, 1, 0, Constants.DEFAULT_AGENT_ENERGY, 0, new NeuralController(Constants.HERBIVORE_WEIGHT_MATRIX, Constants.HERBIVORE_SHIFT_VECTOR), this);
		}
		for(int i=0; i<Constants.INITIAL_PRADATOR_COUNT; i++){
			new Predator(1, 1, 0, Constants.DEFAULT_AGENT_ENERGY, 0, new NeuralController(Constants.PREDATOR_WEIGHT_MATRIX, Constants.PREDATOR_SHIFT_VECTOR), this);
		}

		locationCreator.placeAgent(AgentLocationCreator.PLACE_RANDOM);
//		herb.setMoveDirection(Agent.NORD);
	}

	@Override
	public void takt() {
		for(int i=0; i<agentsList.size(); i++){
			agentsList.get(i).doStep();
		}
	}

	/**
	 * Удаление агента, метод вызыватся в клссе Agent.java
	 * при гибели агента
	 * @param agent
	 */
	public void removeAgent(Agent agent){
		agentsList.remove(agent);
	}

	/**
	 * Добавление агента, метод вызывается в конструкторе класса
	 * Agent.java при создании нового агента
	 * @param agent
	 */
	public void addAgent(Agent agent){
		agentsList.add(agent);
	}

	public List<Agent> getAgentsList() {
		return agentsList;
	}

	public void setAgentsList(List<Agent> agentsList) {
		this.agentsList = agentsList;
	}


}
